package com.apps.routing;

import java.util.Iterator;
import java.util.List;

import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Point;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;

public class RouteOverlay extends Overlay {
	 private final List<GeoPoint> routePoints;
     /** Colour to paint routePoints. **/
     private int colour;
     /** Alpha setting for route overlay. **/
     private static final int ALPHA = 120;
     /** Stroke width. **/
     private static final float STROKE = 4.5f;
     /** Route path. **/
     private final Path path;
     /** Point to draw with. **/
     private final Point p;
     /** Paint for path. **/
     private final Paint paint;


     /**
      * Public constructor.
      * 
      * @param route Route object representing the route.
      * @param defaultColour default colour to draw route in.
      */

     public RouteOverlay(final Route route, final int defaultColour) {
             super();
             routePoints = route.getPoints();
             colour = defaultColour;
             path = new Path();
             p = new Point();
             paint = new Paint();
     }

     @Override
     public final void draw(final Canvas c, final MapView mv,
                     final boolean shadow) {
             super.draw(c, mv, shadow);

             paint.setColor(colour);
             paint.setAlpha(ALPHA);
             paint.setAntiAlias(true);
             paint.setStrokeWidth(STROKE);
             paint.setStyle(Paint.Style.STROKE);

             redrawPath(mv);
             c.drawPath(path, paint);
     }

     /**
      * Set the colour to draw this route's overlay with.
      * 
      * @param c  Int representing colour.
      */
     public final void setColour(final int c) {
             colour = c;
     }

     /**
      * Clear the route overlay.
      */
     public final void clear() {
             routePoints.clear();
     }

     /**
      * Recalculate the path accounting for changes to
      * the projection and routePoints.
      * @param mv MapView the path is drawn to.
      */

     private void redrawPath(final MapView mv) {
             final Projection prj = mv.getProjection();
             path.rewind();
             final Iterator<GeoPoint> it = routePoints.iterator();
             prj.toPixels(it.next(), p);
             path.moveTo(p.x, p.y);
             while (it.hasNext()) {
                     prj.toPixels(it.next(), p);
                     path.lineTo(p.x, p.y);
             }
             path.setLastPoint(p.x, p.y);
     }

}